package com.niit.scala

/**
 * Date:2025/3/18
 * Author：Ys
 * Description:
 */
object Base06 {

  // 父类    人类
  class Person{
    var name:String = _
    var age:Int = _
    def eat()=println("人要吃饭")
  }
  // 子类  老师类
  class Teacher extends Person
  //子类   学生类
  class Student extends Person

  /*
  抽象 ：abstract  定义抽象类  在抽象类中的方法都是抽象方法
     没有方法体的方法就是抽象方法
   */
   abstract class Shape{//抽象类不能进行实例化，需要匿名实例化
    def area:Double
  }
  class Square(var edge:Double) extends Shape{
    override def area: Double = edge*edge
  }

  class Circle(var radius:Double) extends Shape{
    override def area: Double = 3.14*radius*radius
  }

  class Rectangle(var width:Double,var height:Double) extends Shape{
    override def area: Double = width*height
  }

  /*
      Scala中的特质关键字 trait
      特点：
         特质可以提高代码的复用性
         特质可以提供代码的扩展性和可维护性
         类与特质是继承关系，类与类只支持单继承，类与特质可以单继承也可以是多继承
         Scala的特质中可以有普通字段、抽象字段、普通方法、抽象方法
         如果特质只有抽象内容可以叫做瘦接口 如果既有抽象内容又又具体内容 可以叫做富接口
       interface == trait
   */
  trait Logger{
    def log(msg:String) // 没有方法体的方法称之为抽象方法
  }
  trait File{
    def write(msg:String)
  }

  class ConsoleLogger extends Logger with File{
    override def log(msg: String): Unit = println("打印数据在日志当中"+msg)

    override def write(msg: String): Unit = println("将数据写入到磁盘"+msg)
  }

  /*
    样例类 是一种特殊的类，一般用于保存数据，在后面数据分析中的并发编程上会用的很多

    case class 类名(var/val 参数名:参数类型,var/val 参数名:参数类型)
     变量修改不写，默认是val
   */
  case class People(name:String,var age:Int = 23)

  def main(args: Array[String]): Unit = {
/*
    val teacher = new Teacher
    teacher.name="张三"
    teacher.age=18
    teacher.eat()
    println(teacher.name)
    println(teacher.age)

    val student = new Student
    student.name="李四"
    student.age=19
    student.eat()
    println(student.name)
    println(student.age)

    //多态  父类引用指向子类对象--》 用父类去装子类  子类去承接父类
    val square:Shape = new Square(3)
    println(square.area)
    val circle:Shape = new Circle(5)
    println(circle.area)
    val rectangle:Shape = new Rectangle(3,4)
    println(rectangle.area)*/

    val consoleLogger = new ConsoleLogger
    consoleLogger.log("hello")
    consoleLogger.write("World")

    val people = People("张三")
    people.age = 12
    println(people)
  }
}
